package com.fireworks.geoevents.gui;

import com.fireworks.geoevents.R;
import android.R.drawable;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.view.KeyEvent;
import android.widget.DatePicker;
import android.widget.TimePicker;

/**
 * Implementa los dialogos de introduccion de fecha y hora del formulario de
 * creacion de un evento nuevo.
 * 
 * 1- Establecer fecha.
 * 
 * 2- Establecer hora.
 * 
 * 
 * @author Fireworks
 * @version 3 - Octubre - 2012
 */
public class DialogsManager extends DialogFragment {

	/*------------------------------------*/
	/* /////////// INTERFACES /////////// */
	/*------------------------------------*/
	/**
	 * La clase 'NewEventActivity' debera implementar esta interfaz para poder
	 * recibir notificaciones acerca de los eventos que se producen en el
	 * dialogo y asi poder tratarlos adecuadamente.
	 */
	public interface NoticeDialogListener {

		/**
		 * Pulsacion sobre el boton positivo del dialogo
		 * 
		 * @param type
		 *            Seleccion de fecha/Seleccion de hora
		 * @param date_time
		 *            Cadena de texto con la fecha/hora seleccionada
		 */
		public void onDialogPositiveClick(int type, String date_time);

		/**
		 * Pulsacion sobre el boton negativo del dialogo
		 * 
		 * @param type
		 *            Seleccion de fecha/Seleccion de hora
		 * @param date_time
		 *            Cadena de texto con la fecha/hora seleccionada
		 */
		public void onDialogNegativeClick(int type, String date_time);

	} // Fin interfaz 'NoticeDialogListener'

	/*-----------------------------------*/
	/* /////////// ATRIBUTOS /////////// */
	/*-----------------------------------*/
	private static int type = 0;
	private NoticeDialogListener dialogListener = null; // Oyente del dialogo.
	private DatePicker dp = null;
	private TimePicker tp = null;

	/*---------------------------------*/
	/* /////////// METODOS /////////// */
	/*---------------------------------*/
	/**
	 * Retorna una instancia de 'NewEventDialog'
	 */
	public static DialogsManager newInstance() {

		return new DialogsManager();

	} // Fin metodo 'newInstance'

	/**
	 * Devuelve el tipo de dialogo.
	 */
	public static int getType() {

		return type;

	} // Fin metodo 'getType'

	/**
	 * Permite definir el tipo de dialogo.
	 * 
	 * @param type
	 *            Dialogo para seleccion de fecha o seleccion de hora.
	 */
	public static void setType(int type) {

		DialogsManager.type = type;

	} // Fin metodo 'setType'

	/**
	 * Se encarga de crear el dialogo, inicializando ciertos componentes de
	 * este.
	 */
	@Override
	public Dialog onCreateDialog(Bundle savedInstanceState) {

		AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

		// Se evita que la pulsacion sobre la tecla de busqueda cierre el
		// dialogo.
		builder.setOnKeyListener(new DialogInterface.OnKeyListener() {
			@Override
			public boolean onKey(DialogInterface dialog, int keyCode,
					KeyEvent event) {
				if (keyCode == KeyEvent.KEYCODE_SEARCH
						&& event.getRepeatCount() == 0) {
					return true;
				}
				return false;
			}
		});

		// Se rellena el dialogo.
		fillDialog(builder);
		return builder.create();

	} // Fin metodo 'onCreateDialog'

	/**
	 * Permite establecer la actividad que contiene al dialogo y a su vez
	 * registrar a esta como oyente de eventos sobre el dialogo.
	 */
	@Override
	public void onAttach(Activity activity) {

		super.onAttach(activity);
		// Se verifica que la actividad contenedora implementa la interfaz
		// de oyente.
		try {
			// La activida contenedora recibira los eventos sobre el dialogo
			// para gestionarlos adecuadamente.
			dialogListener = (NoticeDialogListener) activity;
		} catch (ClassCastException e) {
			// La actividad contenedora no implementa la interfaz.
			throw new ClassCastException(activity.toString()
					+ " debe implementar NoticeDialogListener");
		}

	} // Fin metodo 'onAttach'

	/**
	 * Se encarga de rellenar el dialogo con el mensaje y los botones adecuados
	 * segun el tipo de dialogo.
	 * 
	 * @param builder
	 *            Constructor del dialogo
	 */
	private void fillDialog(AlertDialog.Builder builder) {

		// Se establece el titulo y contenido del dialogo.
		switch (getType()) {
		case 1: { // FECHA
			builder.setIcon(drawable.ic_menu_today);
			builder.setTitle(R.string.enter_date);
			dp = new DatePicker(getActivity());
			builder.setView(dp);
			break;

		}
		case 2: { // HORA
			builder.setIcon(drawable.ic_menu_recent_history);
			builder.setTitle(R.string.enter_time);
			tp = new TimePicker(getActivity());
			tp.setIs24HourView(true);
			builder.setView(tp);
			break;

		}
		}

		// Se establecen los botones y sus acciones asociadas.
		builder.setPositiveButton(R.string.confirm_lab,
				new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int id) {

						if (getType() == 1) { // FECHA
							String date = "";
							date += Integer.toString(dp.getDayOfMonth()) + "/";
							date += Integer.toString(dp.getMonth() + 1) + "/";
							date += Integer.toString(dp.getYear());

							dialogListener.onDialogPositiveClick(
									DialogsManager.getType(), date);

						} else if (getType() == 2) { // HORA
							String time = "";
							time += Integer.toString(tp.getCurrentHour()) + ":";
							time += Integer.toString(tp.getCurrentMinute());
							dialogListener.onDialogPositiveClick(
									DialogsManager.getType(), time);
						}

					}
				});
		builder.setNegativeButton(R.string.cancel_lab,
				new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int id) {
					}
				});

	} // Fin metodo 'fillDialog'

} // Fin clase 'NewEventDialog'
